﻿using System.Collections.Generic;

namespace Gqq.CSharpindepth2.DesignPatterns.ObserverCollection
{
    public abstract class Subject
    {
        private readonly List<Observer> _lstObserver = new List<Observer>();

        /// <summary>
        /// 把所有的观察者放入这个List中去。
        /// 等到SubAction
        /// 方法执行后，通过Notify方法通知这些观察者去做他们应该做的事情
        /// </summary>
        /// <param name="ob"></param>
        public void Regist(Observer ob)
        {
            _lstObserver.Add(ob);
        }

        /// <summary>
        /// 所有的Subject在执行完自己动作后，必须执行这个方法，
        /// 让所有的观察者产生动作
        /// </summary>
        private void Notify()
        {
            foreach (Observer observer in _lstObserver)
            {
                observer.Acion();
            }
        }

        /// <summary>
        /// 虚方法，可以被不同的Subject子类重写
        /// </summary>
        public virtual void SubAction()
        {
            Notify();
        }
    }
}
